package com.demo.controller;

import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.demo.entity.FunList;
import com.google.gson.Gson;

import lombok.extern.slf4j.Slf4j;
/**
 * 前端传参必须加traditional
 * 默认的话，traditional为false，即jquery会深度序列化参数对象，以适应如PHP和Ruby on Rails框架， 但servelt api无法处理，
 * 我们可以通过设置traditional 为true阻止深度序列化，
 * eg:
 * --------------traditional:false的情况-------------------------------
 * list=[1,2,3,4,5,6]
 * 前端传过来是:list%5B%5D=1&list%5B%5D=2&list%5B%5D=3&list%5B%5D=4&list%5B%5D=5&list%5B%5D=6
 * %5B%5D是[]的转义,这时候后台mvc解码错误，导致报错（不管List<>是什么,String/Integer等都一视同仁）
 * --------------traditional:true的情况-------------------------------
 * list=[1,2,3,4,5,6]
 * 前端传过来是:list=1&list=2&list=3&list=4&list=5&list=6
 * 这时候前端传参正常，但如果直接在Controller用List接收，报错java.lang.NoSuchMethodException: java.util.List.<init>()
 * （有兴趣可以了解下MVC参数注入，这里用@param绑定也同样出现上述问题）
 * 解决方案是通过使用对象对参数进行封装（参考下述接口中的FunList）
 * -------------------------------------------------------
 * @date 2020年1月3日
 */
@Controller
@Slf4j
public class ListController{
	public static final Gson GSON=new Gson();//Gson对象
	/**
	 * 直接传List
	 * 结果:报java.lang.NoSuchMethodException错误
	 * @param list
	 */
	@PostMapping("/list/self")
	@ResponseBody
	public void list1(List<String> list){
		log.info("list1:" +GSON.toJson(list));
	}
	/**
	 * 使用对象封装List
	 * 正确接收的条件:
	 * 1)ajax的traditional为true
	 * 2)后台接口用对象接收
	 * @param list
	 */
	@PostMapping("/list/obj")
	@ResponseBody
	public void list2(FunList funList){
		log.info("list2:" +GSON.toJson(funList));
	}
}
